package vivo

import (
	"dta-apk/global"
	"dta-apk/model"
	"dta-apk/utils"
	"encoding/json"
	"fmt"
)

const vivo_server = VIVO_PRODUCT_URL

/*
apk文件上传
*/
func UploadApk(filePath, packageName, version string) (*UploadApkResult, bool) {
	belong := "vivo_apk_" + version
	var apkFile model.FileModel
	isE := model.FindOne(&apkFile, &model.FileModel{Belong: belong})
	if isE {
		return &UploadApkResult{
			PackageName:  packageName,
			Serialnumber: apkFile.Path,
			FileMd5:      apkFile.Md5,
		}, true
	}
	commonParam := getCommonParam(method_upload_apk)
	// 转为map，添加自定义参数
	paramMap := utils.StructToStringMap(commonParam)
	// 包名
	paramMap["packageName"] = packageName
	// 文件md5
	fmt.Println(filePath)
	paramMap["fileMd5"] = utils.GetFileMd5(filePath)
	// 签名
	sign := getSign(paramMap, global.Config.App.Vivo.AccessSecret)
	if sign == "" {
		utils.Info("参数签名错误")
		return nil, false
	}
	paramMap["sign"] = sign
	// 发起上传请求
	result := utils.PostFormFile(vivo_server, paramMap, "file", filePath)
	utils.Info("vivo文件上传结果：%v", result)
	// 转换结构
	var uploadResult VivoApkResult
	err := json.Unmarshal([]byte(result), &uploadResult)
	if err != nil {
		utils.Error(err)
		return nil, false
	}
	if uploadResult.Code == 0 {
		// 如果上传成功保存数据
		fileModel := model.FileModel{
			Path:   uploadResult.Data.Serialnumber,
			Type:   "vivo_apk",
			Md5:    uploadResult.Data.FileMd5,
			Belong: belong,
		}
		model.Save(&fileModel)
	} else {
		utils.Info(uploadApkSubCode[uploadResult.SubCode])
		return nil, false
	}

	return &uploadResult.Data, true
}

/*
app 详细信息
*/
func GetAppDetails(packageName string) (*VivoAppInfo, bool) {
	// 公共参数
	commonParam := getCommonParam(method_app_details)
	// 转为map，添加自定义参数
	paramMap := utils.StructToStringMap(commonParam)
	// 包名
	paramMap["packageName"] = packageName
	// 签名
	sign := getSign(paramMap, global.Config.App.Vivo.AccessSecret)
	paramMap["sign"] = sign
	// 查询详情
	var appInfoResult VivoAppInfoResult
	result := utils.PostForm(vivo_server, paramMap)
	utils.Info("获取Vivo应用详细信息, 详情：%v", result)
	json.Unmarshal([]byte(result), &appInfoResult)
	if appInfoResult.Code == 0 {
		return &appInfoResult.Data, true
	}
	return nil, false
}

/*
承诺函上传
*/
func UploadLetter(filePath string, packageName string) {
	commonParam := getCommonParam(method_commitment_letter)
	// 转为map，添加自定义参数
	paramMap := utils.StructToStringMap(commonParam)
	// 包名
	paramMap["packageName"] = packageName
	// 签名
	sign := getSign(paramMap, global.Config.App.Vivo.AccessSecret)
	paramMap["sign"] = sign
	// 发起上传请求
	result := utils.PostFormFile(vivo_server, paramMap, "file", filePath)
	fmt.Println(result)
}

/*
应用logo
*/
func UploadIcon(filePath string, packageName string) {
	commonParam := getCommonParam(method_upload_icon)
	// 转为map，添加自定义参数
	paramMap := utils.StructToStringMap(commonParam)
	// 包名
	paramMap["packageName"] = packageName
	// 签名
	sign := getSign(paramMap, global.Config.App.Vivo.AccessSecret)
	paramMap["sign"] = sign
	// 发起上传请求
	result := utils.PostFormFile(vivo_server, paramMap, "file", filePath)
	fmt.Println(result)
}

/*
应用截图
*/
func UploadScreenshot(filePath string, packageName string) {
	commonParam := getCommonParam(method_upload_screenshot)
	// 转为map，添加自定义参数
	paramMap := utils.StructToStringMap(commonParam)
	// 包名
	paramMap["packageName"] = packageName
	// 签名
	sign := getSign(paramMap, global.Config.App.Vivo.AccessSecret)
	paramMap["sign"] = sign
	// 发起上传请求
	result := utils.PostFormFile(vivo_server, paramMap, "file", filePath)
	fmt.Println(result)
}

/*
特殊资质
*/
func UploadQualification(filePath string, packageName string) {
	commonParam := getCommonParam(method_upload_qualification)
	// 转为map，添加自定义参数
	paramMap := utils.StructToStringMap(commonParam)
	// 包名
	paramMap["packageName"] = packageName
	// 签名
	sign := getSign(paramMap, global.Config.App.Vivo.AccessSecret)
	paramMap["sign"] = sign
	// 发起上传请求
	result := utils.PostFormFile(vivo_server, paramMap, "file", filePath)
	fmt.Println(result)
}

/*
电子版权
*/
func UploadEcopyright(filePath string, packageName string) {
	commonParam := getCommonParam(method_upload_ecopyright)
	// 转为map，添加自定义参数
	paramMap := utils.StructToStringMap(commonParam)
	// 包名
	paramMap["packageName"] = packageName
	// 签名
	sign := getSign(paramMap, global.Config.App.Vivo.AccessSecret)
	paramMap["sign"] = sign
	// 发起上传请求
	result := utils.PostFormFile(vivo_server, paramMap, "file", filePath)
	fmt.Println(result)
}

/*
安全报告
*/
func UploadSafetyReport(filePath string, packageName string) {
	commonParam := getCommonParam(method_upload_safety_report)
	// 转为map，添加自定义参数
	paramMap := utils.StructToStringMap(commonParam)
	// 包名
	paramMap["packageName"] = packageName
	// 签名
	sign := getSign(paramMap, global.Config.App.Vivo.AccessSecret)
	paramMap["sign"] = sign
	// 发起上传请求
	result := utils.PostFormFile(vivo_server, paramMap, "file", filePath)
	fmt.Println(result)
}

/*
应用创建
*/
func CreateApp(app VivoAppInfo) {
	commonParam := getCommonParam(method_create_app)
	// 转为map
	commonMap := utils.StructToMap(commonParam)
	appMap := utils.StructToMap(app)
	// 合并请求参数
	paramMap := utils.MergeMap(commonMap, appMap)
	// 请求
	result := utils.PostBody(vivo_server, paramMap)
	fmt.Println(result)
}

/*
应用更新
*/
func UpdateApp(app VivoAppInfo) {
	commonParam := getCommonParam(method_update_app)
	// 转为map
	commonMap := utils.StructToMap(commonParam)
	appMap := utils.StructToMap(app)
	// 合并请求参数
	paramMap := utils.MergeMap(commonMap, appMap)
	// 请求
	result := utils.PostBody(vivo_server, paramMap)
	fmt.Println(result)
}

// apk升级版本
func UpdateApk(packageName, filePath, updateDesc, version string) (bool, string) {
	// 先上传apk文件，获取流水号
	uploadApkResult, isS := UploadApk(filePath, packageName, version)
	if !isS {
		updateMsg := "apk文件上传失败"
		return false, updateMsg
	}
	// 公共参数
	commonParam := getCommonParam(method_update_app)
	// 升级参数
	uploadParam := map[string]string{
		"packageName": packageName,                  // * 应用包名
		"versionCode": version,                      // * 应用版本号
		"apk":         uploadApkResult.Serialnumber, // * 应用Apk 文件上传返回的流水号
		"fileMd5":     uploadApkResult.FileMd5,      // * apk包的MD5值
		"onlineType":  "1",                          // * 请参照文档中心字段项目描述
		"updateDesc":  updateDesc,                   // 新版说明
	}
	// 参数合并
	param := utils.MergeStringMap(utils.StructToStringMap(commonParam), uploadParam)
	// 签名
	sign := getSign(param, global.Config.App.Vivo.AccessSecret)
	param["sign"] = sign
	// 请求
	result := utils.PostForm(vivo_server, param)
	utils.Info("vivo应用更新结果：%s", result)
	var vivoResult VivoResult
	json.Unmarshal([]byte(result), &vivoResult)

	if vivoResult.Code != 0 {
		return false, vivoResult.Msg
	}

	if vivoResult.SubCode != "0" {
		return false, updateApkSubCode[vivoResult.SubCode]
	}

	return true, vivoResult.Msg
}
